1use crate::re::BGSEncounterZone::BGSEncounterZone;
2use crate::re::BSAtomic::BSSpinLock;
3use crate::re::BSBitField::BSBitField;
4use crate::re::BSPointerHandle::ObjectRefHandle;
5use crate::re::BSTArray::BSTArray;
6use crate::re::BSTList::BSSimpleList;
7use crate::re::BSTSmartPointer::BSTSmartPointer;
8use crate::re::ExtraDataList::ExtraDataList;
9use crate::re::FormTypes::FormType;
10use crate::re::InteriorData::INTERIOR_DATA;
11use crate::re::NiSmartPointer::NiPointer;
12use crate::re::TESForm::TESForm;
13use crate::re::TESFullName::TESFullName;
14use crate::re::TESObjectREFR::TESObjectREFR;
15use crate::re::TESWorldSpace::TESWorldSpace;
16use crate::re::offsets_rtti::RTTI_TESObjectCELL;
17use crate::re::offsets_vtable::VTABLE_TESObjectCELL;
18use crate::re::{
19 BGSLightingTemplate, BGSWaterUpdateI, BSMultiBoundNode, BSPortalGraph, BSTMap, BSTSet, NavMesh,
20 NiNode, TESObjectLAND,
21};
22use crate::rel::id::VariantID;
23use core::sync::atomic::AtomicI32;
24
25#[repr(C)]
26#[derive(Debug)]
27pub struct BGSTerrainVisibilityData {
28 pub visData: *mut BSBitField, }
30const _: () = assert!(core::mem::size_of::<BGSTerrainVisibilityData>() == 0x8);
31
32#[repr(C)]
34#[derive(Debug)]
35pub struct EXTERIOR_DATA {
36 pub cellX: i32, pub cellY: i32, pub maxHeightData: *mut i8, pub lodVisData: *mut BGSTerrainVisibilityData, pub worldX: f32, pub worldY: f32, pub landHideFlags: u8, pub pad21: u8, pub pad22: u16, pub pad24: u32, }
47const _: () = assert!(std::mem::size_of::<EXTERIOR_DATA>() == 0x28);
48
49#[commonlibsse_ng_derive_internal::to_bitflags]
50#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
51pub enum LandHideFlag {
52 None = 0,
53 Quad1 = 1 << 0,
54 Quad2 = 1 << 1,
55 Quad3 = 1 << 2,
56 Quad4 = 1 << 3,
57}
58
59#[repr(C)]
61pub struct NavMeshArray {
62 pub navMeshes: BSTArray<BSTSmartPointer<NavMesh>>, }
64const _: () = assert!(std::mem::size_of::<NavMeshArray>() == 0x18);
65
66#[repr(C)]
68pub struct LOADED_CELL_DATA {
69 pub portalGraph: NiPointer<BSPortalGraph>, pub cell3D: NiPointer<NiNode>, pub lightMarkerNode: NiPointer<NiNode>, pub soundMarkerNode: NiPointer<NiNode>, pub multiBoundNode: NiPointer<NiNode>, pub unk028: u64, pub unk030: u64, pub unk038: u64, pub unk040: BSTArray<ObjectRefHandle>, pub flickeringLights: BSTArray<ObjectRefHandle>, pub emittanceSourceRefMap: BSTMap<*mut TESForm, ObjectRefHandle>, pub emittanceLightRefMap: BSTMap<ObjectRefHandle, *mut NiNode>, pub multiboundRefMap: BSTMap<ObjectRefHandle, NiPointer<BSMultiBoundNode>>, pub refMultiboundMap: BSTMap<*mut BSMultiBoundNode, ObjectRefHandle>, pub activatingRefs: BSSimpleList<ObjectRefHandle>, pub unk100: BSSimpleList<ObjectRefHandle>, pub unk110: u64, pub unk118: BSTArray<*mut ()>, pub decalRefs: BSTArray<ObjectRefHandle>, pub skyActors: BSTArray<ObjectRefHandle>, pub encounterZone: *mut BGSEncounterZone, pub decalsQueued: bool, pub criticalQueuedRefCount: AtomicI32, pub queuedRefCount: AtomicI32, pub queuedDistantRefCount: AtomicI32, pub unk178: i32, pub refsFullyLoaded: bool, }
97const _: () = assert!(std::mem::size_of::<LOADED_CELL_DATA>() == 0x180);
98
99#[repr(C)]
100#[derive(Debug)]
101pub struct TESObjectCELL {
102 pub tes_form: TESForm, pub tes_full_name: TESFullName, pub grassCreateLock: BSSpinLock, pub grassTaskLock: BSSpinLock, pub cellFlags: u16, pub cellGameFlags: u16, pub cellState: u8, pub autoWaterLoaded: bool, pub cellDetached: bool, pub pad047: u8, pub extraList: ExtraDataList, pub cellData: CellData, pub cellLand: *mut TESObjectLAND, pub waterHeight: f32, pub navMeshes: *mut NavMeshArray, pub references: BSTSet<NiPointer<TESObjectREFR>>, pub unk0B0: *mut TESForm, pub objectList: BSTArray<*mut TESObjectREFR>, pub unk0D0: BSTArray<*mut ()>, pub waterObjects: BSTArray<*mut BGSWaterUpdateI>, pub unk100: BSTArray<*mut ()>, pub spinLock: BSSpinLock, pub worldSpace: *mut TESWorldSpace, pub loadedData: *mut LOADED_CELL_DATA, pub lightingTemplate: *mut BGSLightingTemplate, pub unk138: u64, }
134
135#[repr(C)]
136pub union CellData {
137 pub exterior: *mut EXTERIOR_DATA,
138 pub interior: *mut INTERIOR_DATA,
139}
140const _: () = assert!(std::mem::size_of::<CellData>() == 0x8);
141impl core::fmt::Debug for CellData {
142 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
143 unsafe {
144 f.debug_struct("CellData")
145 .field("exterior", &self.exterior)
146 .field("interior", &self.interior)
147 .finish()
148 }
149 }
150}
151
152impl TESObjectCELL {
153 pub const RTTI: VariantID = RTTI_TESObjectCELL;
154 pub const VTABLE: [VariantID; 2] = VTABLE_TESObjectCELL;
155 pub const FORM_TYPE: FormType = FormType::Cell;
156}
157
158pub enum Flag {
159 None = 0,
160 IsInteriorCell = 1 << 0,
161 HasWater = 1 << 1,
162 CanTravelFromHere = 1 << 2,
163 NoLODWater = 1 << 3,
164 HasTempData = 1 << 4,
165 PublicArea = 1 << 5,
166 HandChanged = 1 << 6,
167 ShowSky = 1 << 7,
168 UseSkyLighting = 1 << 8,
169 WarnToLeave = 1 << 9,
170}
171
172pub enum CellState {
173 Attached = 7,
174}